package com.citas.client.widget;

import java.util.ArrayList;

import com.citas.client.Display;
import com.citas.client.Getdata;
import com.citas.client.GetdataAsync;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.view.client.NoSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionModel;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.user.client.ui.Image;
import com.sun.java.swing.plaf.windows.WindowsBorders;

public class PanelBusqueda extends Composite {
	
	private  ArrayList<String[]> especialidades=new ArrayList<String[]>();
	private  ArrayList<String[]> departamentos=new ArrayList<String[]>();
	private  ArrayList<String[]> provincias=new ArrayList<String[]>();
	private  ArrayList<String[]> distritos=new ArrayList<String[]>();
	private  ArrayList<String[]> centrosMedicos;
	private SingleSelectionModel<String[]> selectionModel;
	private static PanelBusquedaUiBinder uiBinder = GWT
			.create(PanelBusquedaUiBinder.class);
	@UiField CellTable<String[] > tabla = new CellTable<String[]>();
	@UiField ListBox especialidad;
	
	@UiField ListBox Departamento;
	@UiField ListBox Distrito;
	@UiField ListBox Provincia;
	@UiField Button buscar;
	@UiField Image image;
	
	private Command comando;
	
	private final GetdataAsync consulta = GWT
			.create(Getdata.class);
	
	interface PanelBusquedaUiBinder extends UiBinder<Widget, PanelBusqueda> {
	}
	
	PanelReservaCita panelReservaCita=null;
	
	public void mostrar(){
		Display.get().setWidget(this);
		
	}
	
	public PanelReservaCita getPanelReservaCita(){
		if(panelReservaCita==null){
			panelReservaCita=new PanelReservaCita(new Command() {
				
				@Override
				public void execute() {
					// TODO Auto-generated method stub
					mostrar();
				}
			});
		}
		return panelReservaCita;
	}
	
	public PanelBusqueda(Command co) {
		selectionModel= new SingleSelectionModel<String[]>();
		tabla.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
		initWidget(uiBinder.createAndBindUi(this));
		comando=co;
		consulta.getaDatadb("select * from  \"especialidadmedica\"",
				new AsyncCallback<ArrayList<String[]> >(){
	
			@Override
			public void onSuccess(ArrayList<String[]> result) {	
				especialidades=result;
				actualizar(especialidad,result);
			}
		
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("No se pudo mostrar Especialidades");
			}
			}
		);	
		

		consulta.getaDatadb("select \"idubigeo\",\"nombreubigeo\" from \"ubigeo\" where \"fidubigeo\"=\"idubigeo\"",
				new AsyncCallback<ArrayList<String[]> >(){
	
			@Override
			public void onSuccess(ArrayList<String[]> result) {
				
				for(String[] a:result){
					Departamento.addItem(a[1]);
					departamentos.add(a);
				}			
				cargarProvincias();
			}
		
			@Override
			public void onFailure(Throwable caught) {
				
				Window.alert("No se pudo mostrar Departamentos");
				}
			
			}
		);	
	

		tabla.setSelectionModel(selectionModel);	
		    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
		    	
		    	@Override
		    	public void onSelectionChange(SelectionChangeEvent event) {
		        String[] selected = selectionModel.getSelectedObject();
		        	Cookies.setCookie("idespecialidad",especialidades.get(especialidad.getSelectedIndex())[0]);
		        	Cookies.setCookie("idcentromedico",selected[0]);
		        	getPanelReservaCita().mostrar();
		      }
		    });
		    
	}
	
	public void verHorariosDeCentroMedico(){
		
		Window.alert("Usted selecciono ");
		
	}
	
	public void actualizar(ListBox lb,ArrayList<String[]> li){
		for(String[] a:li){
			lb.addItem(a[1]);
		}		
	}
	
	
	@UiHandler("Departamento")
	void onDepartamentoChange(ChangeEvent event) {
		cargarProvincias();
	}
	
	private void cargarProvincias(){
		Provincia.clear();
		Distrito.clear();
		int in=Departamento.getSelectedIndex();
		consulta.getaDatadb("select \"idubigeo\",\"nombreubigeo\" from \"ubigeo\" where \"fidubigeo\"="+
				departamentos.get(in)[0]+"and \"fidubigeo\"!=\"idubigeo\"",
				new AsyncCallback<ArrayList<String[]> >(){
	
			@Override
			public void onSuccess(ArrayList<String[]> result) {
				provincias=result;
				for(String[] a:result){
					Provincia.addItem(a[1]);
				}		
				cargarDistritos();
			}
		
			@Override
			public void onFailure(Throwable caught) {
				
				Window.alert("No se pudo mostrar Provincias");
			}
		}
			);		
	}
	@UiHandler("Provincia")
	void onProvinciaChange(ChangeEvent event) {
		
		cargarDistritos();
	}
	
	private void cargarDistritos(){
		
		Distrito.clear();
		int in=Provincia.getSelectedIndex();

		consulta.getaDatadb("select \"idubigeo\",\"nombreubigeo\" from \"ubigeo\" where \"fidubigeo\"="+
				provincias.get(in)[0],
				new AsyncCallback<ArrayList<String[]> >(){
	
			@Override
			public void onSuccess(ArrayList<String[]> result) {
				distritos=result;
				for(String[] a:result){
					Distrito.addItem(a[1]);
				}				
			}
		
			@Override
			public void onFailure(Throwable caught) {
				
				Window.alert("No se pudo mostrar Distritos");
			}
		}
	);	
	}
	@UiHandler("buscar")
	void onBuscarClick(ClickEvent event) {
		int in_d=Distrito.getSelectedIndex();
		int in_e=especialidad.getSelectedIndex();
		
			
		consulta.getaDatadb("SELECT ES.idestablecimientosalud,ES.nombreestablecimientosalud,ES.direccion FROM especialidadcentrosalud ECS,establecimientosalud ES "+
				"WHERE ECS.idespecialidad="+especialidades.get(in_e)[0]+" AND ECS.idestablecimientosalud=ES.idestablecimientosalud and "+
				"ES.idubigeo="+distritos.get(in_d)[0]+";",
				new AsyncCallback<ArrayList<String[]> >(){
	
			@Override
			public void onSuccess(ArrayList<String[]> result) {
				centrosMedicos=result;
				mostrarCentrosMedicos();

			}
		
			@Override
			public void onFailure(Throwable caught) {
				
				Window.alert("No se pudo mostrar Resultado de busqueda");
			}
		}
	);	
	}
	
	public void mostrarCentrosMedicos(){
		
		int count = tabla.getColumnCount();
		for(int i=0;i<count;i++){ 
			tabla.removeColumn(0); 
		}
		TextColumn<String[]> nombre = new TextColumn<String[]>() {
		     @Override
		     public String getValue(String[] object) {
				return object[1];
		     }
		};
		
		tabla.addColumn(nombre, "Centro Medico");
		TextColumn<String[]> direccion = new TextColumn<String[]>() {
		     @Override
		     public String getValue(String[] object) {
				return object[2];
		     }
		};
		tabla.addColumn(direccion,"Direccion");
		
		
		tabla.setColumnWidth(nombre, "300px");
		tabla.setColumnWidth(direccion, "300px");
		tabla.setRowCount(centrosMedicos.size(), true);
	    tabla.setRowData(0,centrosMedicos);
	    
   
        tabla.setPageSize(20);
	   
		
	}
	@UiHandler("image")
	void onImageClick(ClickEvent event) {
		comando.execute();
	}
}
